package cn.seaboot.commons.lang;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 标准图表实体类
 * <p>
 * 这是一个标准，并不是一个工具，项目上的所有图表数据，会被打包成这个对象。
 * <p>
 * 设计目的是：方便前后端人员，提前安排代码设计。
 * <p>
 * 一般来说，图表的数据解析，我们会放到前端界面上，配套的代码会是 javascript。
 * <p>
 * 以柱状图为例：有 1-5 月份的数据，每个月有水费、电费两种数据
 *
 * @author Mr.css
 * @version 2023-03-02 11:14
 */
public class Chart implements Serializable {
    private static final long serialVersionUID = -8137215240962397480L;
    /**
     * 图表类型
     * <p>
     * 同一种数据，可以绘制很多种图表，前端根据这个值进行样式选择。
     * <p>
     * 比如折线图的数据，拿去绘制柱状图，一般也是可以的。
     */
    private String type;
    /**
     * 图表名称，逻辑用
     */
    private String name;
    /**
     * 图表名称，展示用
     */
    private String label;

    /**
     * 类名，逻辑用
     * <p>
     * 这个字段用于从数据提取属性，将提取到的属性作为 class-labels 使用。
     */
    private String className;
    /**
     * 类名，展示用
     * <p>
     * x 轴的名称，也就是案例中的月份信息。
     */
    private String[] classLabels;

    /**
     * 字段名称数组，逻辑用
     * <p>
     * 用于提取具体的数值，水费和电费具体数值是多少。
     */
    private String[] fieldNames;
    /**
     * 案例中的费用信息，水费还是电费，label 用于直接展示。
     */
    private String[] fieldLabels;
    /**
     * 数据列表
     */
    private List<?> list;
    /**
     * 附加信息
     * <p>
     * 例如：图例、色值
     */
    private Map<String, Object> attach;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String[] getClassLabels() {
        return classLabels != null ? Arrays.copyOf(classLabels, classLabels.length) : null;
    }

    public void setClassLabels(String[] classLabels) {
        this.classLabels = Arrays.copyOf(classLabels, classLabels.length);
    }

    public String[] getFieldNames() {
        return fieldNames != null ? Arrays.copyOf(fieldNames, fieldNames.length) : null;
    }

    public void setFieldNames(String[] fieldNames) {
        this.fieldNames = Arrays.copyOf(fieldNames, fieldNames.length);
    }

    public String[] getFieldLabels() {
        return fieldLabels != null ? Arrays.copyOf(fieldLabels, fieldLabels.length) : null;
    }

    public void setFieldLabels(String[] fieldLabels) {
        this.fieldLabels = Arrays.copyOf(fieldLabels, fieldLabels.length);
    }

    public List<?> getList() {
        return list;
    }

    public void setList(List<?> list) {
        this.list = list;
    }

    public Map<String, Object> getAttach() {
        return attach;
    }

    public void setAttach(Map<String, Object> attach) {
        this.attach = attach;
    }

    @Override
    public String toString() {
        return "Chart{" +
                "type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", label='" + label + '\'' +
                ", className='" + className + '\'' +
                ", classLabels=" + Arrays.toString(classLabels) +
                ", fieldNames=" + Arrays.toString(fieldNames) +
                ", fieldLabels=" + Arrays.toString(fieldLabels) +
                ", list=" + list +
                ", attach=" + attach +
                '}';
    }
}
